package com.google.rui.demos.camera.demos;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;

import android.app.Activity;
import android.content.Context;
import android.content.pm.PackageManager;
import android.hardware.Camera;
import android.hardware.Camera.PictureCallback;
import android.media.MediaRecorder;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.FrameLayout;

import com.google.rui.demos.R;

public class CameraDemosActivity extends Activity {
	
	private final String TAG=this.getClass().getSimpleName();
	private Camera mCamera=null;
    private CameraPreview mPreview;
    private MediaRecorder mMediaRecorder;
    private boolean isRecording = false;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.camera_main);

        // Create an instance of Camera
     //   mCamera = getCameraInstance();

        // Create our Preview view and set it as the content of our activity.
        mPreview = new CameraPreview(this, mCamera);
        FrameLayout preview = (FrameLayout) findViewById(R.id.camera_preview);
        preview.addView(mPreview);
        
     // Add a listener to the Capture button
        Button captureButton = (Button) findViewById(R.id.button_takepic);
        captureButton.setOnClickListener(
            new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    // get an image from the camera
                    mCamera.takePicture(null, null, mPicture);
                }
            }
        );
        
      
       
     // Add a listener to the Capture button
     final Button  captureButton_video = (Button) findViewById(R.id.button_video);
     captureButton.setOnClickListener(
         new View.OnClickListener() {
             @Override
             public void onClick(View v) {
                 if (isRecording) {
                     // stop recording and release camera
                     mMediaRecorder.stop();  // stop the recording
                     releaseMediaRecorder(); // release the MediaRecorder object
                     mCamera.lock();         // take camera access back from MediaRecorder

                     // inform the user that recording has stopped
                     //setCaptureButtonText("Capture");
                     captureButton_video.setText("Capture");
                     isRecording = false;
                 } else {
                     // initialize video camera
                     if (prepareVideoRecorder()) {
                         // Camera is available and unlocked, MediaRecorder is prepared,
                         // now you can start recording
                         mMediaRecorder.start();

                         // inform the user that recording has started
                         //setCaptureButtonText("Stop");
                         captureButton_video.setText("Capture");
                         isRecording = true;
                     } else {
                         // prepare didn't work, release the camera
                         releaseMediaRecorder();
                         // inform user
                     }
                 }
             }
         }
     );
        
        
        
    }
	
    @Override
	protected void onDestroy() {
		// TODO Auto-generated method stub
		super.onDestroy();
		releaseCamera();
	}

	private PictureCallback mPicture = new PictureCallback() {

        @Override
        public void onPictureTaken(byte[] data, Camera camera) {

            File pictureFile = getOutputMediaFile(MEDIA_TYPE_IMAGE);
            if (pictureFile == null){
//                Log.d(TAG, "Error creating media file, check storage permissions: " +
//                    e.getMessage());
                return;
            }

            try {
                FileOutputStream fos = new FileOutputStream(pictureFile);
                fos.write(data);
                fos.close();
            } catch (FileNotFoundException e) {
                Log.d(TAG, "File not found: " + e.getMessage());
            } catch (IOException e) {
                Log.d(TAG, "Error accessing file: " + e.getMessage());
            }
        }
    };
    
    
	/** Check if this device has a camera */
	public boolean checkCameraHardware(Context context) {
	    if (context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA)){
	        // this device has a camera
	        return true;
	    } else {
	        // no camera on this device
	        return false;
	    }
	}
	
	/** A safe way to get an instance of the Camera object. */
	public  Camera getCameraInstance(){
		if(!checkCameraHardware(this)){
			return null;
		}
	    Camera c = null;
	    try {
	        c = Camera.open(); // attempt to get a Camera instance
	    }
	    catch (Exception e){
	        // Camera is not available (in use or does not exist)
	    	Log.e(TAG, e.toString());
	    	releaseCamera();
	    }
	    return c; // returns null if camera is unavailable
	}
	
	 private void releaseMediaRecorder(){
	        if (mMediaRecorder != null) {
	            mMediaRecorder.reset();   // clear recorder configuration
	            mMediaRecorder.release(); // release the recorder object
	            mMediaRecorder = null;
	            mCamera.lock();           // lock camera for later use
	        }
	    }

	    private void releaseCamera(){
	        if (mCamera != null){
	            mCamera.release();        // release the camera for other applications
	            mCamera = null;
	        }
	    }
	    
	    //**********************************
	    //*Capturing videos  拍摄录像
	    //**********************************
	    
	    
	    private boolean prepareVideoRecorder(){

	        mCamera = getCameraInstance();
	        mMediaRecorder = new MediaRecorder();

	        // Step 1: Unlock and set camera to MediaRecorder
	        mCamera.unlock();
	        mMediaRecorder.setCamera(mCamera);

	        // Step 2: Set sources
	        mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER);
	        mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);

	        // Step 3: Set a CamcorderProfile (requires API Level 8 or higher)
	        // mMediaRecorder.setProfile(CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH));

	        // Step 3: Set output format and encoding (for versions prior to API Level 8)
	        mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
	        mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);
	        mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.DEFAULT);
	        
	        // Step 4: Set output file
	        mMediaRecorder.setOutputFile(getOutputMediaFile(MEDIA_TYPE_VIDEO).toString());

	        // Step 5: Set the preview output
	        mMediaRecorder.setPreviewDisplay(mPreview.getHolder().getSurface());

	        // Step 6: Prepare configured MediaRecorder
	        try {
	            mMediaRecorder.prepare();
	        } catch (IllegalStateException e) {
	            Log.d(TAG, "IllegalStateException preparing MediaRecorder: " + e.getMessage());
	            releaseMediaRecorder();
	            return false;
	        } catch (IOException e) {
	            Log.d(TAG, "IOException preparing MediaRecorder: " + e.getMessage());
	            releaseMediaRecorder();
	            return false;
	        }
	        return true;
	    }
	    
	    
	
	    
	    
	 
	
	    //******** 存储位置设置******//
	    
	    public static final int MEDIA_TYPE_IMAGE = 1;
	    public static final int MEDIA_TYPE_VIDEO = 2;

	    /** Create a file Uri for saving an image or video */
	    private static Uri getOutputMediaFileUri(int type){
	          return Uri.fromFile(getOutputMediaFile(type));
	    }

	    /** Create a File for saving an image or video */
	    private static File getOutputMediaFile(int type){
	        // To be safe, you should check that the SDCard is mounted
	        // using Environment.getExternalStorageState() before doing this.

	        File mediaStorageDir = new File(Environment.getExternalStoragePublicDirectory(
	                  Environment.DIRECTORY_PICTURES), "MyCameraApp");
	        // This location works best if you want the created images to be shared
	        // between applications and persist after your app has been uninstalled.

	        // Create the storage directory if it does not exist
	        if (! mediaStorageDir.exists()){
	            if (! mediaStorageDir.mkdirs()){
	                Log.d("MyCameraApp", "failed to create directory");
	                return null;
	            }
	        }

	        // Create a media file name
	        String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
	        File mediaFile;
	        if (type == MEDIA_TYPE_IMAGE){
	            mediaFile = new File(mediaStorageDir.getPath() + File.separator +
	            "IMG_"+ timeStamp + ".jpg");
	        } else if(type == MEDIA_TYPE_VIDEO) {
	            mediaFile = new File(mediaStorageDir.getPath() + File.separator +
	            "VID_"+ timeStamp + ".mp4");
	        } else {
	            return null;
	        }

	        return mediaFile;
	    }
	    
}
